package com.shenhaofeng.app.utils.net;

import android.annotation.TargetApi;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.support.v4.net.ConnectivityManagerCompat;


/**
 * 设备网络工具
 * Created by Administrator on 2016/10/11.
 */
public class NetUtil {


    /**
     * 检查设备网络是否可用，调用该方法需要保证拥有{@link android.Manifest.permission#ACCESS_NETWORK_STATE}权限
     *
     * @param context 上下文对象
     * @return 是否有可用网络
     */
    public static boolean isConnected(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        //获取当前活动的详细信息默认数据网络
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {//检查是有可用的网络并且已连接
            return true;
        }
        return false;
    }


    /**
     * 检查是不是一个移动网络连接
     *
     * @param context
     * @return 是否通过移动网络连接
     */
    public static boolean isMobileConnected(Context context) {
        return getConnectType(context) == ConnectivityManager.TYPE_MOBILE_DUN
                || getConnectType(context) == ConnectivityManager.TYPE_MOBILE;
    }


    /**
     * 检查是否是通过Wifi连接至网络
     *
     * @param context 上下文环境
     * @return 是否通过Wifi连接
     */
    public static boolean isWifiConnected(Context context) {
        return getConnectType(context) == ConnectivityManager.TYPE_WIFI;
    }


    /**
     * 检查是否是一个WiMax连接
     *
     * @param context 上下文环境
     * @return 是否通过WiMax连接
     */
    public static boolean isWiMaxConnected(Context context) {
        return getConnectType(context) == ConnectivityManager.TYPE_WIMAX;
    }


    /**
     * 检查是不是一个虚拟网络连接，该方法至少在版本21之后才有效
     *
     * @param context 上下文环境
     * @return 是否通过虚拟网络连接
     */
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static boolean isWiVpnConnected(Context context) {
        return getConnectType(context) == ConnectivityManager.TYPE_VPN;
    }


    /**
     * 获取连接类型的名称
     *
     * @param context 上下文环境
     * @return 连接类型的名称, 可能为null
     */
    public static String getConnectTypeName(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        //获取当前活动的详细信息默认数据网络
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {//检查是有可用的网络并且已连接
            return networkInfo.getTypeName();
        }
        return null;
    }


    /**
     * 获取连接至网络的类型
     *
     * @param context 上下文环境
     * @return 连接的网络类型 如果没有连接将会返回-1，
     * 一般会返回以下值
     * {@link ConnectivityManager#TYPE_MOBILE}, {@link
     * ConnectivityManager#TYPE_WIFI}, {@link ConnectivityManager#TYPE_WIMAX}, {@link
     * ConnectivityManager#TYPE_ETHERNET},  {@link ConnectivityManager#TYPE_BLUETOOTH},
     * 具体的网络连接类型请看 {@link ConnectivityManager}
     * @see ConnectivityManager
     */
    public static int getConnectType(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        //获取当前活动的详细信息默认数据网络
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {//检查是有可用的网络并且已连接
            return networkInfo.getType();
        }
        return -1;
    }


    /**
     * 现在设备现在是否流量敏感,在传输大数据时应该提示用户推迟处理数据额传输
     *
     * @param context
     * @return
     */
    public static boolean isActiveNetworkMetered(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return ConnectivityManagerCompat.isActiveNetworkMetered(connectivityManager);
    }
}
